﻿//using Microsoft.Extensions.Logging;
//using System.Net.WebSockets;
//using System.Text;

//namespace ARPaintServer.Websocket
//{
//	public class WebsocketHandlerMiddleware
//	{
//		private readonly ILogger _logger;
//		private readonly RequestDelegate _next;

//		public WebsocketHandlerMiddleware(ILogger<WebsocketHandlerMiddleware> logger, RequestDelegate next)
//		{
//			_logger = logger;
//			_next = next;
//		}

//		public async Task Invoke(HttpContext context)
//		{
//			// 拦截路由为ws的请求
//			if (context.Request.Path == "/ws")
//			{
//				// 仅当网页执行new WebSocket("ws://xxxxx:xxxx/ws")时，后台会执行此逻辑
//				if (context.WebSockets.IsWebSocketRequest)
//				{
//					// 后台成功接收到连接请求并建立连接后，前台的webSocket.onopen = function (event){}才执行
//					WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

//					string clientId = Guid.NewGuid().ToString(); ;
//					var wsClient = new WebsocketClient
//					{
//						Id = clientId,
//						WebSocket = webSocket
//					};

//					try
//					{
//						await Handle(wsClient);
//					}
//					catch (Exception ex)
//					{
//						//logger.LogError(ex, "Echo websocket client {0} err .", clientId);
//						await context.Response.WriteAsync("closed");
//					}
//				}
//				else
//				{
//					context.Response.StatusCode = 404;
//				}
//			}
//			else
//			{
//				await _next(context);
//			}
//		}

//		/// <summary>
//		/// 循环接收消息
//		/// </summary>
//		/// <param name="websocketClient"></param>
//		/// <returns></returns>
//		private async Task Handle(WebsocketClient websocketClient)
//		{
//			WebsocketClientCollection.Add(websocketClient);
//			//logger.LogInformation($"Websocket client added.");

//			WebSocketReceiveResult clientData = null;
//			do
//			{
//				var buffer = new byte[1024 * 1];
//				//客户端与服务器成功建立连接后，服务器会循环异步接收客户端发送的消息，收到消息后就会执行Handle(WebsocketClient websocketClient)中的do{}while;直到客户端断开连接
//				//不同的客户端向服务器发送消息后台执行do{}while;时，websocketClient实参是不同的，它与客户端一一对应
//				//同一个客户端向服务器多次发送消息后台执行do{}while;时，websocketClient实参是相同的
//				clientData = await websocketClient.WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
//				if (clientData.MessageType == WebSocketMessageType.Text && !clientData.CloseStatus.HasValue)
//				{
//					var msgString = Encoding.UTF8.GetString(buffer);
//					logger.LogInformation($"Websocket client ReceiveAsync message {msgString}.");
//					var message = JsonConvert.DeserializeObject<Message>(msgString);
//					message.SendClientId = websocketClient.Id;
//					HandleMessage(message);
//				}
//			} while (!clientData.CloseStatus.HasValue);
//			//关掉使用WebSocket连接的网页/调用webSocket.close()后，与之对应的后台会跳出循环
//			WebsocketClientCollection.Remove(websocketClient);
//			logger.LogInformation($"Websocket client closed.");
//		}

//		private void HandleMessage(Message message)
//		{
//			var client = WebsocketClientCollection.Get(message.SendClientId);
//			switch (message.action)
//			{
//				case "join":
//					client.RoomNo = message.roomNo;
//					client.SendMessageAsync($"{message.nick} join room {client.RoomNo} success .");
//					logger.LogInformation($"Websocket client {message.SendClientId} join room {client.RoomNo}.");
//					break;
//				case "send_to_room":
//					if (string.IsNullOrEmpty(client.RoomNo))
//					{
//						break;
//					}
//					var clients = WebsocketClientCollection.GetClientsByRoomNo(client.RoomNo);
//					clients.ForEach(c =>
//					{
//						c.SendMessageAsync(message.nick + " : " + message.msg);
//					});
//					logger.LogInformation($"Websocket client {message.SendClientId} send message {message.msg} to room {client.RoomNo}");
//					break;
//				case "leave":
//					#region 通过把连接的RoomNo置空模拟关闭连接
//					var roomNo = client.RoomNo;
//					client.RoomNo = "";
//					#endregion

//					#region 后台关闭连接
//					//client.WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
//					//WebsocketClientCollection.Remove(client); 
//					#endregion

//					client.SendMessageAsync($"{message.nick} leave room {roomNo} success .");
//					logger.LogInformation($"Websocket client {message.SendClientId} leave room {roomNo}");
//					break;
//				default:
//					break;
//			}
//		}

//	}
//}
